﻿Imports Microsoft.DirectX.Direct3D
Imports Microsoft.DirectX
Imports Commander_Wars.Spieletools
<Serializable()> Public Class ObjektSpieler
    Implements ICloneable
    Public Const MaximaleDeffensivestärke As Integer = 190
    Public Const TextWarteZeit As Integer = 20
#Region "Variablen"
    ''' <summary>
    ''' Wenn False greift die KI keine Schweißnähte, Mauern an, aber weiterhin feindliche Minigeschütze usw.
    ''' Hat nur für KI-Stufen Normal aufwärts auswirkungen.
    ''' </summary>
    ''' <remarks></remarks>
    Public NeutraleGebäudeAngriff As Boolean = True
    Private FfondsproStadt As Integer
    Public Property FondsproStadt() As Integer
        Get
            Return FfondsproStadt
        End Get
        Set(ByVal value As Integer)
            FfondsproStadt = value
        End Set
    End Property
    Public KOS() As ObjektKO
    Private Fond As Integer
    Public Property Fonds() As Integer
        Get
            Return Fond
        End Get
        Set(ByVal value As Integer)
            If value > 0 Then
                Fond += FondsproStadt * value
            ElseIf value = 0 Then
                Fond = 0
            Else
                Fond += value
            End If
        End Set
    End Property
    Public Sub AddFonds(ByVal Value As Integer)
        Fond += Value
        If Fond < 0 Then
            Fond = 0
        End If
    End Sub
    Public Sub SetFonds(ByVal neuFonds As Integer)
        Fond = neuFonds
    End Sub
    Private Teams As Char
    Public Property Team() As Char
        Get
            Return Teams
        End Get
        Set(ByVal value As Char)
            Teams = value
        End Set
    End Property
    Private Armeen As String
    Public Property Armee() As String
        Get
            Return Armeen
        End Get
        Set(ByVal value As String)
            Armeen = value
        End Set
    End Property
    <NonSerialized()> Private Spielern As Integer
    Public Property Spieler() As Integer
        Get
            Return Spielern
        End Get
        Set(ByVal value As Integer)
            Spielern = value
        End Set
    End Property
    Private Gabeleisten As Boolean = True
    ''' <summary>
    ''' Gibt an ob dieser Spieler seine Gabe einsetzen kann.
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Property Gabeleiste() As Boolean
        Get
            Return Gabeleisten
        End Get
        Set(ByVal value As Boolean)
            Gabeleisten = value
        End Set
    End Property
    Public KIStufe As KIStufen = KIStufen.Mensch
    Enum KIStufen
        Mensch
        Kinderleicht
        Einfach
        Normal
        Mittel

        Geschlossen
        Offen
        Passiv
    End Enum
    <NonSerialized()> Public Sendetürme As Integer = 0
    <NonSerialized()> Public Minen As Integer = 0
    <NonSerialized()> Public Geldgebäude As Integer = 0
    Public Bauliste As Bauliste = Nothing
    Private Fabrikfondse As Integer
    ''' <summary>
    ''' Am Punkt X Y Z=Schlacht sieht man W Felder alles auch in Wälder und Riffe
    ''' </summary>
    ''' <remarks></remarks>
    Public Sichtfelder As Vector4() = {}
    Public Property Fabrikfonds() As Integer
        Get
            Return Fabrikfondse
        End Get
        Set(ByVal value As Integer)
            Fabrikfondse = value
        End Set
    End Property
    Public VeränderteWerte As WertedurchGabegeändert
    Public Bauprioritäten As KIGenerellerSuperBau.PrioritätsBau = Nothing
    <NonSerialized()> Public SpielerBaublockade As Baublockade = Nothing
#Region "Texturen"
    Public ExternGezogeneEinheiten As ExternGezogeneEinheit() = {}
    Public Farbe As Color
    Structure SpezialGebäude
        Implements ICloneable
        Public Sub New(ByVal neuTextur As String, ByVal neuID As String, ByVal Farbtabelle As Bitmap, Optional ByVal Neutral As Boolean = False)
            
        End Sub
        Private Textur As Texture
        Public ReadOnly Property SpezialgebäudeTextur() As Texture
            Get
                Return Textur
            End Get
        End Property
        Private SymbolTextur As Texture
        Public ReadOnly Property SpezialgebäudeSymbol() As Texture
            Get
                Return SymbolTextur
            End Get
        End Property
        Private ID As String
        Public ReadOnly Property GebäudeID() As String
            Get
                Return ID
            End Get
        End Property
        ''' <summary>
        ''' Nur eine flache Kopie
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function Clone() As Object Implements System.ICloneable.Clone
            Return MemberwiseClone()
        End Function
    End Structure

    <Serializable()> Structure ExternGezogeneEinheit
        Implements ICloneable
        Dim ZielX As Integer
        Dim ZielY As Integer
        Dim Einheit As ObjektEinheit
        Dim Befehl As Befehle
        ''' <summary>
        ''' Z.Bsp. GebäudeID das gebaut werden soll.
        ''' </summary>
        ''' <remarks></remarks>
        Dim ZielID As String
        Dim NächsterBefehl As NächsteBefehle
        Enum Befehle
            WartenBisAngriff
            Bauen
            Heilen
        End Enum
        Enum NächsteBefehle
            Keiner
            Entfernen
        End Enum
        Public Sub New(ByVal ZielX As Integer, ByVal ZielY As Integer, ByVal Einheit As ObjektEinheit, ByVal Befehl As Befehle, ByVal ZielID As String, ByVal NächsterBEfehl As NächsteBefehle)
            Me.ZielX = ZielX
            Me.ZielY = ZielY
            Me.ZielID = ZielID
            Me.NächsterBefehl = NächsterBEfehl
            Me.Befehl = Befehl
            Me.Einheit = Einheit
        End Sub
        ''' <summary>
        ''' Eine Flache Kopie nicht gut.
        ''' </summary>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function Clone() As Object Implements System.ICloneable.Clone
            Return MemberwiseClone()
        End Function
    End Structure
#End Region
#End Region
#Region "Spieler erstellen"
    Public Sub New(ByVal neuSpieler As Integer, ByVal Farbe As Color, ByVal neuFondsproStadt As Integer, ByVal neuKOS() As ObjektKO, ByVal Startfonds As Integer, ByVal neuArmee As String, ByVal neuTeam As String, ByVal neuBauliste As ObjektTabelle, ByVal neuKIStufe As KIStufen, ByVal Fabrikfonds As Integer)
        Spieler = neuSpieler
        Armee = neuArmee
        FondsproStadt = neuFondsproStadt
        KOS = neuKOS
        Fond = Startfonds
        Team = neuTeam
        Sendetürme = 0
        Me.Farbe = Farbe
        KIStufe = neuKIStufe
        Bauliste = neuBauliste
        Me.Fabrikfondse = Fabrikfonds
        VeränderteWerte = New WertedurchGabegeändert(0)
    End Sub


    Public Function KannGabe() As Boolean
        If VeränderteWerte.Gabeeinsatz = True Then
            If KOS(0).KannGabe Then
                Return True
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function
    Public Function KannSpezialGabe() As Boolean
        If VeränderteWerte.Gabeeinsatz = True Then
            If KOS(0).KannSpezialGabe Then
                Return True
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function
    Public Function KannDoppelGabe() As Boolean
        If VeränderteWerte.Gabeeinsatz = True Then
            If IsNothing(KOS(1)) = False Then
                If KOS(0).KannSpezialGabe And KOS(1).KannSpezialGabe Then
                    Return True
                Else
                    Return False
                End If
            Else
                Return False
            End If
        Else
            Return False
        End If
    End Function
    ''' <summary>
    ''' Wechselt die KO's
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Wechsel()

        If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
            Dim Befehl As KIPassivNetzwerk.Befehl
            Befehl.Befehl = ObjektKI.KIModiExtern.Wechsel
            Befehl.KooX = -1
            Befehl.KooY = -1
            Befehl.WegX = New Integer() {-1}
            Befehl.WegY = New Integer() {-1}
            Befehl.OpferX = -1
            Befehl.OpferY = -1
            Befehl.AngreiferSchaden = -1
            Befehl.Verteidigerschaden = -1
            Befehl.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
            Hauptmenü.NetzBefehlSenden(Befehl)
        End If

        Dim Text As String = Objektverwalter.KOS(KOS(1).Bild).KOBeschreibung.Tauschsätze(Zufallszahl(0, Objektverwalter.KOS(KOS(1).Bild).KOBeschreibung.Tauschsätze.Length - 1))
        ObjektKODialog.NeuerDialog(New ObjektKODialog.KOText() {New ObjektKODialog.KOText(KOS(1).Bild, Text, Spieler, ObjektKOTextZeile.KOGesichtsAusdruck.Lachend, TextWarteZeit)}, , ObjektKODialog.NächsteAktionen.RundenEnde)
        Dim KO As ObjektKO = KOS(0)
        KOS(0) = KOS(1)
        KOS(1) = KO
        'KO Einheit übergeben!
        KOS(0).SetKOEinheit(KOS(1).GetKOEinheit)
        KOS(1).KOEinheitWechsel()

        Grafikengine.Lichtändern(KOS(0).getLichtfarbe)
    End Sub

    Public Function GetDeffensivStärke(ByVal Einheit As ObjektEinheit, ByVal Landschaft As ObjektLandschaft, ByVal Fernkampf As Boolean) As Integer
        Dim Deffensive As Integer = 100
        'Wir laden die Deffensiv Stärke der Einheit

        If My.Settings.CommanderWarsGameMoodus <> CommanderWarsGameModi.CommanderWars2 Then
            'Je nach Stufe wird die Einheit stärker
            Select Case Einheit.EinheitenStufe
                Case ObjektEinheit.Stufe.Leutnant
                    Deffensive += 0
                Case ObjektEinheit.Stufe.Offizier
                    Deffensive += 0
                Case ObjektEinheit.Stufe.General
                    Deffensive += 10
                Case ObjektEinheit.Stufe.Veteran
                    Deffensive += 20
                Case ObjektEinheit.Stufe.KO
                    Deffensive += 20
                Case Else
                    Deffensive += 0
            End Select
        End If
        If KOS(0).IsInKOZone(Einheit) Then
            'Standard Deffensive
            If IsNothing(KOS(0).DeffensivStärke) = False Then
                Deffensive = KOS(0).DeffensivStärke.GetWert(Einheit.EinheitenID)
                If Deffensive < 0 Then
                    Deffensive = 100
                End If
            End If
            'Deckung
            If Not Landschaft Is Nothing Then
                Dim Deckung As Integer = Landschaft.GetDeckung
                If Not Einheit.Bewegungsart = MovementSorts.Flugzeug.tostring And Not Einheit.Bewegungsart = MovementSorts.Helikopter.tostring Then
                    Deffensive += 10 * Deckung * Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).VeränderteWerte.TerrainVeränder
                End If
            End If
            Deffensive += Sendetürme * KOS(0).SendeTurmStärke.Y
            Deffensive += Einheit.ATKDEFBoost.Y
            If Fernkampf = True Then
                Deffensive += KOS(0).Zusatzdeffensive.Y
            Else
                Deffensive += KOS(0).Zusatzdeffensive.X
            End If
        Else
            If Not Landschaft Is Nothing Then
                Dim Deckung As Integer = Landschaft.GetDeckung
                If Not Einheit.Bewegungsart = MovementSorts.Flugzeug.tostring And Not Einheit.Bewegungsart = MovementSorts.Helikopter.tostring Then
                    Deffensive += 10 * Deckung * Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).VeränderteWerte.TerrainVeränder
                End If
            End If

        End If
        'Wenn unsere Deffensive zu hoch ist sind wir unzerstörbar und das würde die Spiellaune senken.
        If My.Settings.CommanderWarsGameMoodus < CommanderWarsGameModi.CommanderWars Then
            If Deffensive > MaximaleDeffensivestärke Then Deffensive = MaximaleDeffensivestärke
        End If
        If Deffensive < 0 Then Deffensive = 0

        Return Deffensive
    End Function
    Public Function GetOffensivStärke(ByVal Einheit As ObjektEinheit, ByVal Landschaft As ObjektLandschaft, ByVal VerteidigerX As Integer, ByVal VerteidigerY As Integer, ByVal AngreiferLeben As Single, ByVal VerteidigerLeben As Single) As Integer
        Dim Schlacht As Integer = ObjektSpielfeld.Bodenschlacht
        If Einheit.X >= 0 Then
            Schlacht = Einheit.GetMap
        End If
        Dim AngreiferX As Integer = Einheit.X
        Dim AngreiferY As Integer = Einheit.Y
        If AngreiferX >= 0 Then
            If Not Objektverwalter.Spielfeld.Laufen Is Nothing And Objektverwalter.Spielfeld.Einheiten(AngreiferX, AngreiferY, Einheit.GetMap) Is Nothing Then
                AngreiferX = Objektverwalter.Spielfeld.Laufen.Position.X
                AngreiferY = Objektverwalter.Spielfeld.Laufen.Position.Y
            End If
        End If
        Dim Deffender As ObjektEinheit = Nothing
        If VerteidigerX >= 0 Then
            Deffender = Objektverwalter.Spielfeld.Einheiten(VerteidigerX, VerteidigerY, Schlacht)
        End If
        Dim Offensive As Integer = 100
        If My.Settings.CommanderWarsGameMoodus <> CommanderWarsGameModi.CommanderWars2 Then
            'Je nach Stufe wird die Einheit stärker
            Select Case Einheit.EinheitenStufe
                Case ObjektEinheit.Stufe.Leutnant
                    Offensive += 5
                Case ObjektEinheit.Stufe.Offizier
                    Offensive += 10
                Case ObjektEinheit.Stufe.General
                    Offensive += 15
                Case ObjektEinheit.Stufe.Veteran
                    Offensive += 20
                Case ObjektEinheit.Stufe.KO
                    Offensive += 20
                Case Else
                    Offensive += 0
            End Select
        End If
        Select Case My.Settings.CommanderWarsGameMoodus
            Case CommanderWarsGameModi.AdvanceWarsDC
                If Not KOS(0).Wetterimmunität.Contains(Objektverwalter.Spielfeld.Regeln.Wetter) Then
                    'Oh Sandsturm ist in DC\ DoR verdammt heftig
                    If Objektverwalter.Spielfeld.Regeln.Wetter = ObjektSpielfeld.Wetterarten.Sandsturm Then
                        Offensive -= 30
                    End If
                End If
            Case CommanderWarsGameModi.CommanderWars2
                If Not KOS(0).Wetterimmunität.Contains(Objektverwalter.Spielfeld.Regeln.Wetter) Then
                    'Oh Sandsturm ist in DC\ DoR verdammt heftig
                    If Objektverwalter.Spielfeld.Regeln.Wetter = ObjektSpielfeld.Wetterarten.Sandsturm Then
                        If Einheit.Bewegungsart.ToLower <> "wüstenketten" Then
                            Offensive -= 20
                        End If
                    End If
                End If
        End Select
        If KOS(0).IsInKOZone(Einheit) Then
            'Standard Bonus
            If IsNothing(KOS(0).OffensivStärke) = False Then
                Offensive = KOS(0).OffensivStärke.GetWert(Einheit.EinheitenID)
                If Offensive < 0 Then
                    Offensive = 100
                End If
            End If

            'Manche Kos bekommen Noni wenn Einheiten angegriffen werden können oder so
            If VerteidigerX >= 0 And VerteidigerY >= 0 Then
                If Not KOS(0).Kampfbonus = ObjektKO.Kampfboni.No Then
                    Dim AnzahlderEinheiten As Integer = 0
                    For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                        For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                            If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht)) = False Then
                                Select Case KOS(0).Kampfbonus
                                    Case ObjektKO.Kampfboni.Indirects
                                        If Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).Spieler = Spieler Then
                                            If Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).MinimaleReichweite > 1 And Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).MaximaleReichweite > 1 Then
                                                If Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).MinimaleReichweite > 1 Then
                                                    Dim MaximalReichweite As Integer = -1
                                                    MaximalReichweite = Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).MaximaleReichweite
                                                    Dim D As Integer = Math.Abs(X - VerteidigerX) + Math.Abs(Y - VerteidigerY)
                                                    If D <= MaximalReichweite And D >= Einheit.MinimaleReichweite Then
                                                        AnzahlderEinheiten += 1
                                                    End If
                                                End If
                                            End If
                                        End If
                                    Case ObjektKO.Kampfboni.Vision
                                        If Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).Spieler = Spieler Then
                                            If Math.Abs(X - VerteidigerX) + Math.Abs(Y - VerteidigerY) <= Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).GetSicht(X, Y) Then
                                                AnzahlderEinheiten += 1
                                            End If
                                        End If
                                    Case ObjektKO.Kampfboni.EnemyAttack
                                        If Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).Spieler).Team <> Team Then
                                            'Das ist ein Feind
                                            If Objektverwalter.Spielfeld.Einheiten(X, Y, Schlacht).IsInFirerange(Einheit) = True Then
                                                AnzahlderEinheiten += 1
                                            End If
                                        End If
                                End Select
                            End If
                        Next
                    Next
                    'Der Bonus wird addiert
                    Offensive += AnzahlderEinheiten * KOS(0).StärkebonusproEinheit
                End If
            End If
            'Manche Truppen erhalten einen Zusatzboost
            If VerteidigerX >= 0 And VerteidigerY >= 0 Then
                If IsNothing(Objektverwalter.Spielfeld.Einheiten(VerteidigerX, VerteidigerY, Schlacht)) = False Then
                    If Objektverwalter.Spielfeld.Einheiten(VerteidigerX, VerteidigerY, Schlacht).MaximaleReichweite > 1 Then
                        Offensive += KOS(0).Zusatzoffensive.Y
                    Else
                        Offensive += KOS(0).Zusatzoffensive.X
                    End If
                End If
            End If
            'Der Bergbonus von Truppen wird addiert
            If KOS(0).Bergbonus.X <> 0 Then
                Dim Kreis1(,) As Integer = Kreisfunktion(KOS(0).Bergbonus.Y)
                For X = -KOS(0).Bergbonus.Y To KOS(0).Bergbonus.Y
                    For Y = -KOS(0).Bergbonus.Y To KOS(0).Bergbonus.Y
                        If Kreis1(X + KOS(0).Bergbonus.Y, Y + KOS(0).Bergbonus.Y) >= 0 Then
                            Dim X1 As Integer = X + AngreiferX
                            Dim Y1 As Integer = Y + AngreiferY
                            If X1 >= 0 And Y1 >= 0 And X1 < Objektverwalter.Spielfeld.Breite And Y1 < Objektverwalter.Spielfeld.Höhe Then
                                If Objektverwalter.Spielfeld.Landschaften(X1, Y1, Schlacht).getID = "BERG" Or Objektverwalter.Spielfeld.Landschaften(X1, Y1, Schlacht).getID = "GIPFEL" Or Objektverwalter.Spielfeld.Landschaften(X1, Y1, Schlacht).getID = "FELSEN" Then
                                    Offensive += KOS(0).Bergbonus.X
                                    GoTo BergGefunden
                                End If
                            End If
                        End If
                    Next
                Next
BergGefunden:
            End If
            'Falls der KO auf dieser Landschaft einen Bonus erhält
            If Not Landschaft Is Nothing Then
                Dim Stelle As Integer = Array.IndexOf(KOS(0).LandschaftsUntergrund, Landschaft.getID)
                If Stelle >= 0 Then
                    Offensive += KOS(0).LandschaftsStärke
                Else
                    If Not Einheit.IsFlyingUnit Then
                        Stelle = Array.IndexOf(KOS(0).LandschaftsUntergrund, "Deckung")
                        If Stelle >= 0 Then

                            Dim Deckung As Integer = GetDeffensivSterne(Deffender, Landschaft)
                            Offensive += KOS(0).LandschaftsStärke * Deckung
                        End If
                    End If
                    End If
            End If
            'Der Wetterbonus wird addiert
            If KOS(0).Wetter = Objektverwalter.Spielfeld.Regeln.Wetter Then
                Offensive += KOS(0).Wetterbouns
            End If
            'Der Geldstärkebonus wird addiert
            If KOS(0).Geldstärke > 0 Then
                Dim Stärke As Integer = Math.DivRem(Fonds, KOS(0).Geldstärke, 0)
                Offensive += Stärke * 10
            End If
            Offensive += KOS(0).Synergie
            'Der eigene Offensive Boost wird addiert
            Offensive += Einheit.ATKDEFBoost.X
            'Falls der KO Vorteile oder Nachteile gegenüber Gruppen Angriffen hat. bekommt er diese Stärke
            Dim Kreis As Integer(,) = Kreisfunktion(ObjektKO.Radius)
            Dim ZahlderFeinde As Integer = 0
            'Wir finden die Position der Einheit heraus.
            Dim Position As Point = New Point(Einheit.X, Einheit.Y)
            If Einheit.X >= 0 Then
                If Objektverwalter.Spielfeld.Einheiten(Einheit.X, Einheit.Y, Schlacht) Is Nothing Then
                    If Objektverwalter.Spielfeld.Laufen Is Nothing Then
                        'Darf nicht vorkommen kommt aber vor
                        If Not Objektverwalter.Spielfeld.KI Is Nothing Then
                            Position = Objektverwalter.Spielfeld.KI.GetEinheitenZiel
                        End If
                    Else
                        Position = Objektverwalter.Spielfeld.Laufen.Position
                    End If
                End If
                'Wir gehen alle Felder des Kreises durch
                For X = -ObjektKO.Radius To Kreis.GetLength(0) - ObjektKO.Radius - 1
                    For Y = -ObjektKO.Radius To Kreis.GetLength(0) - ObjektKO.Radius - 1
                        If Kreis(ObjektKO.Radius + X, ObjektKO.Radius + Y) > 0 Then
                            If Position.X + X >= 0 And Position.X + X < Objektverwalter.Spielfeld.Breite And Position.Y + Y >= 0 And Position.Y + Y < Objektverwalter.Spielfeld.Höhe Then
                                'Ist auf diesem Feld eine einheit?
                                If Not Objektverwalter.Spielfeld.Einheiten(Position.X + X, Position.Y + Y, Schlacht) Is Nothing Then
                                    'Ja! Ist sie ein Feind?
                                    If Not Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).Team = Objektverwalter.Spielfeld.Spieler(Objektverwalter.Spielfeld.Einheiten(Position.X + X, Position.Y + Y, Schlacht).Spieler).Team Then
                                        'Das sind Feinde. Wie Praktisch dann zählen wir einen Feind dazu
                                        ZahlderFeinde += 1
                                    End If
                                End If
                            End If
                        End If
                    Next
                Next
            End If
            'So jetzt kennen wir die Zahl der Feinde.
            'wenn es mehr als X Einheiten sind wird die Einheit um Y stärker.=)
            If Einheit.Spieler > 0 Then
                If Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).GruppenBoost(0).X < ZahlderFeinde Then
                    Offensive += Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).GruppenBoost(0).Y
                End If
                'Wenn es weniger als X Einheiten sind wird sie um Y Stärker.=)
                If Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).GruppenBoost(1).X > ZahlderFeinde Then
                    Offensive += Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).GruppenBoost(1).Y
                End If
            End If
            'So falls unsere Einnahmen und Fonds verschieden sind kann es sein das wir besser bzw. schlechter kämpfen.
            If KOS(0).ATKundKostensteigererfürFonds.X <> 0 Then
                Dim Einnahmen As Integer = Einkommen()
                If Einnahmen > Fonds Then
                    Dim EinnahmenProzent As Integer = 0.1# * Einnahmen
                    Offensive -= Math.DivRem(Einnahmen - Fonds, EinnahmenProzent, 0) * KOS(0).ATKundKostensteigererfürFonds.X
                ElseIf Einnahmen < Fonds Then
                    Dim EinnahmenProzent As Integer = 0.1# * Einnahmen
                    Offensive += Math.DivRem(Fonds - Einnahmen, EinnahmenProzent, 0) * KOS(0).ATKundKostensteigererfürFonds.X
                End If
            End If
            'Manche KOs sind umso schwächer umso weniger TP ihre Truppen haben
            Offensive -= KOS(0).ZusätlicheKampfschwächeproTP * (10 - Einheit.getKP)
            'Wir sind stärker wenn wir eine bestimmte Landschaft angreifen.
            If VerteidigerX >= 0 And VerteidigerY >= 0 Then
                If FindElement(KOS(0).AufLandschaftsUntergrund, Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Schlacht).getID) >= 0 Then
                    Offensive += KOS(0).AufLandschaftsStärke
                End If
                If AngreiferLeben > VerteidigerLeben Then
                    Offensive += KOS(0).ATKHochfürSchwacheGegner
                End If
            End If
            'Umso mehr Deckung der Gegner hat umso stärker sind wir. Tschüss Kat.
            If Objektverwalter.Spielfeld.OnMap(VerteidigerX, VerteidigerY) = True Then
                Offensive += KOS(0).FeuerstärkeproFeindlicherDeckung * Objektverwalter.Spielfeld.Landschaften(VerteidigerX, VerteidigerY, Schlacht).Deckung
            End If
        End If
        Offensive += Sendetürme * KOS(0).SendeTurmStärke.X
        'Es könnte passieren das die Offensie null wird das sollte nicht passieren.
        If Offensive < 0 Then
            Offensive = 0
        End If
        Return Offensive
    End Function
    Public Function GetDeffensivSterne(ByVal Verteidiger As ObjektEinheit, ByVal Landschaft As ObjektLandschaft)

        Dim Deckung As Integer = Landschaft.Deckung
        If KOS(0).IsInKOZone(Landschaft.KooX, Landschaft.KooY) Then
            If KOS(0).DeckungsÄnderung > 0 Then
                Deckung *= KOS(0).DeckungsÄnderung
            End If
        End If
        If Not Verteidiger Is Nothing Then
            Dim S As ObjektSpieler = Verteidiger.GetSpieler
            If S.KOS(0).DeckungsÄnderung < 0 And S.KOS(0).IsInKOZone(Verteidiger) Then
                Deckung += Verteidiger.GetSpieler.KOS(0).DeckungsÄnderung
                If Deckung < 0 Then
                    Deckung = 0
                End If
            End If
        End If
        Return Deckung
    End Function
    Public Function Teurungsrate(ByVal Einheit As ObjektEinheit, ByVal X As Integer, ByVal Y As Integer) As Single
        Return Teurungsrate(Einheit.EinheitenID, X, Y)
    End Function
    Public Function Teurungsrate(ByVal EinheitenID As String, ByVal X As Integer, ByVal Y As Integer) As Single
        Dim Z As Single = 1
        If KOS(0).IsInKOZone(X, Y) Then
            Z = KOS(0).Teurungsrate - Minen * KOS(0).Minenstärke
            If KOS(0).ATKundKostensteigererfürFonds.Y <> 0 Then
                Dim Einnahmen As Integer = Einkommen()
                If Einnahmen > Fonds Then
                    Dim EinnahmenProzent As Integer = 0.1# * Einnahmen
                    Z -= Math.DivRem(Einnahmen - Fonds, EinnahmenProzent, 0) * KOS(0).ATKundKostensteigererfürFonds.Y / 100
                ElseIf Einnahmen < Fonds Then
                    Dim EinnahmenProzent As Integer = 0.1# * Einnahmen
                    Z += Math.DivRem(Fonds - Einnahmen, EinnahmenProzent, 0) * KOS(0).ATKundKostensteigererfürFonds.Y / 100
                End If
            End If
            For I = 0 To KOS(0).BonusEinheiten.Length - 1
                If KOS(0).BonusEinheiten(I).ID = EinheitenID Then
                    Z += KOS(0).BonusEinheiten(I).Wert
                End If
            Next
        Else
            Z = 1 - Minen * KOS(0).Minenstärke
        End If
        If Z < 0.2# Then
            Z = 0.2#
        End If
        Return Z
    End Function

    Public Function CanProduceUnit(ByVal Unit As ObjektEinheit) As Boolean
        Return CanProduceUnit(Unit.EinheitenID)
    End Function
    Public Function CanProduceUnit(ByVal UnitID As String) As Boolean
        If Bauliste.GetWert(UnitID) > 0 Then
            Return True
        Else
            Return False
        End If
    End Function
    Public Sub SpielerFrameRundenEnde()
        'Tja blöd gelaufen wir verlieren unser restliches Geld
        If VeränderteWerte.KeineFondsamEnde = True Then
            Fond = 0
        End If
        VeränderteWerte.Reset()
        KOS(0).TagEnde()
    End Sub
    Public Sub SpielerFrameRundenAnfang()
        KOS(0).KOFrame()
        KOS(0).Synergie = 0
        If Not KOS(1) Is Nothing Then KOS(1).Synergie = 0
        'Wir machen die Sache mit dem künstlichen Kriegsnebel
        EraseKriegsnebeldurchGabe()

    End Sub
    ''' <summary>
    ''' Berechnet die momementanen reperatur Kosten aller Truppen.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetRepairCosts() As Integer
        Dim Schlachten As Integer = 0
        Dim Fonds As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then Schlachten = 1
        For I = 0 To Schlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                    Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude
                    If Not E Is Nothing Then
                        If Not G Is Nothing Then
                            If E.Spieler = Spieler Then
                                If IsReperaturGebäude(G.GetSpieler) Then
                                    If G.GetBaulisteThisPlayer.Contains(E.EinheitenID) Then
                                        Fonds += GetRepairCosts(E)
                                    Else
                                        If TypeOf G Is GebäudeStadt Then
                                            If ObjektLadeklasse.GetBauliste("BASIS").Contains(E.EinheitenID) Then
                                                Fonds += GetRepairCosts(E)
                                            End If
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
        Return Fonds
    End Function
    ''' <summary>
    ''' Die Reperaturkosten für diese Runde!
    ''' </summary>
    ''' <param name="E"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function GetRepairCosts(ByVal E As ObjektEinheit) As Integer
        Dim Heilung As Integer = 10 - E.getKP
        Dim EinTPKosten As Integer = E.Kosten * Teurungsrate(E, E.X, E.Y) / 10
        Dim Gesamtkosten As Integer = 0
        For I = 1 To Heilung
            If I <= KOS(0).GebäudeHeilung Then
                Gesamtkosten += EinTPKosten
            Else
                Exit For
            End If
        Next
        Return Gesamtkosten
    End Function
    ''' <summary>
    ''' Gibt an wie viele Gegner dieser Spieler hat.:)
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CountEnemies() As Integer
        Dim Enemies As Integer = 0
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).Team <> Team Then
                Enemies += 1
            End If
        Next
        Return Enemies
    End Function
    ''' <summary>
    ''' Hebt Kriegsnebel, welcher durch Gaben erschaffen wurde auf.
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub EraseKriegsnebeldurchGabe()
        Dim NeuNebel As Nebelarten = Objektverwalter.Spielfeld.Regeln.Nebel
        Dim NebelBleibt As Boolean = False
        If KOS(0).KriegsnebelErstellung.Y > 0 Then
            KOS(0).KriegsnebelErstellung.Y -= 1
            If KOS(0).KriegsnebelErstellung.Y <= 0 Then
                KOS(0).KriegsnebelErstellung.Y = 0
                For Each MitSpieler In Objektverwalter.Spielfeld.Spieler
                    For Each KO In MitSpieler.KOS
                        If Not KO Is Nothing Then
                            If KO.KriegsnebelErstellung.Y > 0 Then
                                NebelBleibt = True
                            Else
                                If KO.KriegsnebelErstellung.X <> NeuNebel Then
                                    NeuNebel = KO.KriegsnebelErstellung.X
                                End If
                            End If
                        End If
                    Next
                Next
            End If
        End If
        If Not KOS(1) Is Nothing Then
            If KOS(1).KriegsnebelErstellung.Y > 0 Then
                KOS(1).KriegsnebelErstellung.Y -= 1
                If KOS(1).KriegsnebelErstellung.Y <= 0 Then
                    KOS(1).KriegsnebelErstellung.Y = 0
                    For Each MitSpieler In Objektverwalter.Spielfeld.Spieler
                        For Each KO In MitSpieler.KOS
                            If Not KO Is Nothing Then
                                If KO.KriegsnebelErstellung.Y > 0 Then
                                    NebelBleibt = True
                                Else
                                    If KO.KriegsnebelErstellung.X <> NeuNebel Then
                                        NeuNebel = KO.KriegsnebelErstellung.X
                                    End If
                                End If
                            End If
                        Next
                    Next
                End If
            End If
        End If
        If NebelBleibt = False Then
            Objektverwalter.Spielfeld.Regeln.Nebel = NeuNebel
        End If
        Objektverwalter.Spielfeld.Sichterstellen()
    End Sub
    ''' <summary>
    ''' So bekommt der Spieler für alle seine Gebäude Geld.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub EarnMoney()
        If VeränderteWerte.KeineEinnahmen = False Then
            Dim Einnahmen As Integer = Einkommen()
            'Manche KOs müssen Steuern zahlen oder bekommen Geld aus dem Staatshaushalt. oder so ähnlich.
            Einnahmen += Einnahmen * KOS(0).MehrEinkommen
            AddFonds(Einnahmen)
        End If
    End Sub
    ''' <summary>
    ''' Gibt zurück wie viel man einnimmt
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Einkommen() As Integer
        Dim Einnahmen As Integer = 0
        If VeränderteWerte.GeldproBesetzungszahl = 0 Then
            Einnahmen = Geldgebäude * FondsproStadt
        Else
            Dim Fonds As Integer = 0
            Dim AnzahlSchlachten As Integer = 0
            If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
            For I = 0 To AnzahlSchlachten
                For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                    For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                        If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude Is Nothing Then
                            If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Spieler = Spieler Then
                                If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.getFonds = True Then
                                    Dim Senkung As Integer = ObjektGebäude.Besetzungszahl - Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Besetzung
                                    Senkung = FondsproStadt * Senkung * VeränderteWerte.GeldproBesetzungszahl
                                    Einnahmen += FondsproStadt + Senkung
                                End If
                            End If
                        End If
                    Next
                Next
            Next
        End If
        Einnahmen += Geldgebäude * KOS(0).BonusGeldproGebäude
        Einnahmen -= Einnahmen * VeränderteWerte.Einkommensveränderung
        Return Einnahmen
    End Function
    ''' <summary>
    ''' Berechnet die Zahl der Einheitem
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CountUnits() As Integer
        Dim Schlachten As Integer = 0
        Dim Truppenzahl As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then Schlachten = 1
        For I = 0 To Schlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                    If Not E Is Nothing Then
                        If E.Spieler = Spieler Then
                            Truppenzahl += 1
                            For Each ET In E.Ladung
                                If ET IsNot Nothing Then
                                    Truppenzahl += 1
                                End If
                            Next
                        End If
                    End If
                Next
            Next
        Next
        Return Truppenzahl
    End Function
    ''' <summary>
    ''' Berechnet die Zahl der Gebäude inklusive Minigeschütze usw.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CountBuildings() As Integer
        Dim Schlachten As Integer = 0
        Dim Buildings As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then Schlachten = 1
        For I = 0 To Schlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude
                    If Not G Is Nothing Then
                        If G.Spieler = Spieler Then
                            If Not G.GetRealGebäudeID = "VERWEIS" Then
                                Buildings += 1
                            End If
                        End If
                    End If
                Next
            Next
        Next
        Return Buildings
    End Function
    ''' <summary>
    ''' Berechnet wie stark der Spieler ist.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CalculateSpielerStärke() As Integer
        Dim Schlachten As Integer = 0
        Dim SpielerStärke As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then Schlachten = 1
        For I = 0 To Schlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                    If Not E Is Nothing Then
                        If E.Spieler = Spieler Then
                            SpielerStärke += E.GetEinheitenWert
                        End If
                    End If
                    Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude
                    If Not G Is Nothing Then
                        If G.GetRealGebäudeID <> "VERWEIS" Then
                            Dim GebäudeWert As Integer = ObjektLadeklasse.GetGebäudeKosten(G.GebäudeID, G.Spieler)
                            If GebäudeWert < 0 Then GebäudeWert = 0
                            If GebäudeWert > 0 Then
                                If G.GetMaxLeben > 0 Then
                                    SpielerStärke += GebäudeWert * (G.KP / G.GetMaxLeben)
                                Else
                                    SpielerStärke += GebäudeWert
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
        Dim BuildingProductions As Integer = CountBuildingProductions(-1)
        If BuildingProductions > 0 Then
            SpielerStärke += Einkommen() * CountBuildingProductions(Spieler) / BuildingProductions * 100
        Else
            SpielerStärke += Einkommen()
        End If
        Return SpielerStärke / 100
    End Function
    ''' <summary>
    ''' Zählt die Produktions Gebäude 
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CountBuildingProductions(ByVal FürSpieler As Integer) As Integer
        Dim Schlachten As Integer = 0
        Dim Buildings As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then Schlachten = 1
        For I = 0 To Schlachten
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude
                    If Not G Is Nothing Then
                        If FürSpieler > 0 Then
                            If G.Spieler = Spieler Then
                                If Not G.GetRealGebäudeID = "VERWEIS" Then
                                    If G.GetBaulisteThisPlayer.Length > 0 Then
                                        Buildings += 1
                                    End If
                                End If
                            End If
                        ElseIf Not G.GetRealGebäudeID = "VERWEIS" Then
                            If G.GetBaulisteThisPlayer.Length > 0 Then
                                Buildings += 1
                            End If
                        End If
                    End If
                Next
            Next
        Next
        Return Buildings
    End Function
    ''' <summary>
    ''' Diese Werte wurden durch eine feindliche Gabe verändert und werden am Ende der Runde Resetet
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Structure WertedurchGabegeändert
        Public Sub New(ByVal N As Integer)
            Reset()
        End Sub
        ''' <summary>
        ''' Umso viel werden die Bewegungskosten pro Feld geändert
        ''' </summary>
        ''' <remarks></remarks>
        Public Bewegungskosten As Integer
        ''' <summary>
        ''' umso viel werden Deckungsboni abgeschwächt bzw. verstärkt 1=keine Veränderung
        ''' </summary>
        ''' <remarks></remarks>
        Public TerrainVeränder As Single
        ''' <summary>
        ''' Der Spieler kann keine Truppen bauen
        ''' </summary>
        ''' <remarks></remarks>
        Public KeinBau As Boolean
        ''' <summary>
        ''' Umso viel wird das Einkommen verändert
        ''' </summary>
        ''' <remarks></remarks>
        Public Einkommensveränderung As Single
        ''' <summary>
        ''' Für jeden Besetzungszahl kleiner 0 weniger Geld für diese Stadt.
        ''' </summary>
        ''' <remarks></remarks>
        Public GeldproBesetzungszahl As Single
        ''' <summary>
        ''' Mit so viel TP werden Einheiten gebaut.
        ''' </summary>
        ''' <remarks></remarks>
        Public TPBauEinheiten As Integer
        ''' <summary>
        ''' Wenn True hat man am Runden ende keine Fonds mehr.
        ''' </summary>
        ''' <remarks></remarks>
        Public KeineFondsamEnde As Boolean
        ''' <summary>
        ''' Um so viel Teurer ist eine Reperatur.
        ''' </summary>
        ''' <remarks></remarks>
        Public Reperaturkosten As Single
        ''' <summary>
        ''' Gibt an ob man Angreifen kann.
        ''' </summary>
        ''' <remarks></remarks>
        Public KeinAngriffaußerINF As Boolean
        ''' <summary>
        ''' wenn größer 0 haben alle Einheiten die Sichtweite unten.
        ''' </summary>
        ''' <remarks></remarks>
        Public SichtradiusVeränderung As Integer
        ''' <summary>
        ''' Wenn False kann man keine Gabe einsetzen
        ''' </summary>
        ''' <remarks></remarks>
        Public Gabeeinsatz As Boolean
        ''' <summary>
        ''' wenn -999 dann Default ansonsten Änderung von Glück auf X und Pech auf Y
        ''' </summary>
        ''' <remarks></remarks>
        Public Glücksänderung As Point
        ''' <summary>
        ''' Der Spieler kann keine eigenen TP sehen
        ''' </summary>
        ''' <remarks></remarks>
        Public EigeneTPVersteckt As Boolean
        ''' <summary>
        ''' Der Spieler kann keine feindlichen TP sehen
        ''' </summary>
        ''' <remarks></remarks>
        Public FeindlicheTPVersteckt As Boolean
        ''' <summary>
        ''' X=1 Ja und X=0 Nein und Y=für N-Tage noch
        ''' </summary>
        ''' <remarks></remarks>
        Public KeineVersorgung As Point
        ''' <summary>
        ''' Diese Felder mit X,Y haben die Bewegungskosten Z
        ''' </summary>
        ''' <remarks></remarks>
        Public VeränderteBewegungsFelder As Stack(Of Vector3)
        ''' <summary>
        ''' Wenn True lädt sich die Gabeleiste nicht auf.
        ''' </summary>
        ''' <remarks></remarks>
        Public KeinGabeFortschritt As Boolean
        ''' <summary>
        ''' Wenn True erhält der Spieler keine Information über die Fonds der Spieler
        ''' </summary>
        ''' <remarks></remarks>
        Public KeineFondsInfos As Boolean
        ''' <summary>
        ''' Wenn True erhält der Spieler keine Information über die Einnahmen der Spieler
        ''' </summary>
        ''' <remarks></remarks>
        Public KeineEinnahmenInfos As Boolean
        ''' <summary>
        ''' Wenn True erhalten wir kein Geld diese Runde
        ''' </summary>
        ''' <remarks></remarks>
        Public KeineEinnahmen As Boolean
        Public Sub Reset()
            Bewegungskosten = 0
            TerrainVeränder = 1
            KeinBau = False
            Einkommensveränderung = 0
            GeldproBesetzungszahl = 0
            TPBauEinheiten = 10
            KeineFondsamEnde = False
            Reperaturkosten = 1
            KeinAngriffaußerINF = False
            SichtradiusVeränderung = -1
            Gabeeinsatz = True
            Glücksänderung = New Point(-999, -999)
            EigeneTPVersteckt = False
            FeindlicheTPVersteckt = False
            Dim X As Integer = KeineVersorgung.Y - 1
            If X <= 0 Then
                KeineVersorgung = New Point(0, 0)
            Else
                KeineVersorgung = New Point(1, X)
            End If
            VeränderteBewegungsFelder = New Stack(Of Vector3)
            KeinGabeFortschritt = False
            KeineFondsInfos = False
            KeineEinnahmenInfos = False
            KeineEinnahmen = False
        End Sub
    End Structure
    Public Function GetGlückPech(ByVal X As Integer, ByVal Y As Integer) As Point
        Dim GlückPech As Point
        If VeränderteWerte.Glücksänderung.X = -999 Then
            If KOS(0).IsInKOZone(X, Y) Then
                GlückPech.X = KOS(0).Glück
                GlückPech.Y = KOS(0).Pech
            Else
                GlückPech.X = 0
                GlückPech.Y = 5
            End If
        Else
            GlückPech.X = VeränderteWerte.Glücksänderung.X
            GlückPech.Y = VeränderteWerte.Glücksänderung.Y
        End If
        Return GlückPech
    End Function
    Public Function GetArmyNumber() As Integer
        Dim Army As Integer = [Enum].Parse(Commander_Wars.Armeen.GE.GetType, Armeen)
        If Army < 0 Then
            Return 0
        Else
            Return Army
        End If
    End Function
    ''' <summary>
    ''' Überprüft ob mit diesem Gebäude repariert werden kann.
    ''' </summary>
    ''' <param name="GebäudeSpieler">Der Spieler dem das Gebäude gehört.</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function IsReperaturGebäude(ByVal GebäudeSpieler As ObjektSpieler) As Boolean
        Dim R As ObjektKO.ReperaturGebäude = KOS(0).RepairON
        Select Case My.Settings.CommanderWarsGameMoodus
            Case CommanderWarsGameModi.AdvanceWarsDC, CommanderWarsGameModi.CommanderWars2
                If R = ObjektKO.ReperaturGebäude.Own Then
                    R = ObjektKO.ReperaturGebäude.Allied
                ElseIf R = ObjektKO.ReperaturGebäude.OwnAndEnemy Then
                    R = ObjektKO.ReperaturGebäude.AlliedAndEnemy
                ElseIf R = ObjektKO.ReperaturGebäude.OwnAndEnemyAndNeutral Then
                    R = ObjektKO.ReperaturGebäude.AlliedAndEnemyAndNeutral
                ElseIf R = ObjektKO.ReperaturGebäude.OwnAndNeutral Then
                    R = ObjektKO.ReperaturGebäude.AlliedAndNeutral
                End If
        End Select
        Select Case R
            Case ObjektKO.ReperaturGebäude.OwnAndEnemyAndNeutral
                If GebäudeSpieler.Spieler = Spieler Or GebäudeSpieler.Team <> Team Then
                    Return True
                Else
                    Return False
                End If
            Case ObjektKO.ReperaturGebäude.OwnAndEnemy
                If GebäudeSpieler.Spieler = Spieler Or GebäudeSpieler.Team <> Team And GebäudeSpieler.Spieler > 0 Then
                    Return True
                Else
                    Return False
                End If
            Case ObjektKO.ReperaturGebäude.OwnAndNeutral
                If GebäudeSpieler.Spieler = Spieler Or GebäudeSpieler.Spieler = 0 Then
                    Return True
                Else
                    Return False
                End If
            Case ObjektKO.ReperaturGebäude.Own
                If GebäudeSpieler.Spieler = Spieler Then
                    Return True
                Else
                    Return False
                End If
            Case ObjektKO.ReperaturGebäude.Allied
                If GebäudeSpieler.Team = Team Then
                    Return True
                Else
                    Return False
                End If
            Case ObjektKO.ReperaturGebäude.AlliedAndEnemy
                If GebäudeSpieler.Team = Team Or GebäudeSpieler.Spieler > 0 And GebäudeSpieler.Team <> Team Then
                    Return True
                Else
                    Return False
                End If
            Case ObjektKO.ReperaturGebäude.AlliedAndNeutral
                If GebäudeSpieler.Team = Team Or GebäudeSpieler.Spieler = 0 Then
                    Return True
                Else
                    Return False
                End If
            Case ObjektKO.ReperaturGebäude.AlliedAndEnemyAndNeutral
                Return True
        End Select
    End Function
    ''' <summary>
    ''' Gibt alle Einheiten dieses Spielers zurück
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetUnits() As ObjektEinheit()
        Dim Truppen As ObjektEinheit() = {}
        For Each Unit In Objektverwalter.Spielfeld.Einheiten
            If Not Unit Is Nothing Then
                If Unit.Spieler = Spieler Then
                    Array.Resize(Truppen, Truppen.Length + 1)
                    Truppen(Truppen.Length - 1) = Unit
                End If
            End If
        Next
        Return Truppen
    End Function
    Public Sub AddExternGezogeneEinheit(ByVal ZielX As Integer, ByVal ZielY As Integer, ByVal Einheit As ObjektEinheit, ByVal Befehl As ExternGezogeneEinheit.Befehle, ByVal ZielID As String, ByVal NächsterBefehl As ExternGezogeneEinheit.NächsteBefehle)
        Array.Resize(ExternGezogeneEinheiten, ExternGezogeneEinheiten.Length + 1)
        ExternGezogeneEinheiten(ExternGezogeneEinheiten.Length - 1) = New ExternGezogeneEinheit(ZielX, ZielY, Einheit, Befehl, ZielID, NächsterBefehl)
    End Sub
    Public Sub RemoveEinheit(ByVal E As ObjektEinheit)
        For I = 0 To ExternGezogeneEinheiten.Length - 1
            If E.Equals(ExternGezogeneEinheiten(I).Einheit) Then
                ExternGezogeneEinheiten(I) = ExternGezogeneEinheiten(ExternGezogeneEinheiten.Length - 1)
                Array.Resize(ExternGezogeneEinheiten, ExternGezogeneEinheiten.Length - 1)
                Exit For
            End If
        Next
    End Sub
    Public Sub RemoveEinheit(ByVal E As ObjektEinheit, ByVal Befehl As ExternGezogeneEinheit.Befehle)
        For I = 0 To ExternGezogeneEinheiten.Length - 1
            If ExternGezogeneEinheiten(I).Befehl = Befehl Then
                If E.Equals(ExternGezogeneEinheiten(I).Einheit) Then
                    ExternGezogeneEinheiten(I) = ExternGezogeneEinheiten(ExternGezogeneEinheiten.Length - 1)
                    Array.Resize(ExternGezogeneEinheiten, ExternGezogeneEinheiten.Length - 1)
                    Exit For
                End If
            End If
        Next
    End Sub
    Public Shared Function GetNeutralGebäudeTexturID(ByVal GebäudeID As String) As Integer
        For I = 0 To Objektverwalter.AlleGebäude.Length - 1
            If Objektverwalter.AlleGebäude(I).GebäudeID = GebäudeID Then
                Return I
            End If
        Next
        Return 0
    End Function
    Public Shared Function GetNeutralSpezialGebäudeTexturID(ByVal GebäudeID As String) As Integer
        Dim Spieler As ObjektSpieler = Objektverwalter.Spielfeld.Spieler(0)
        Dim Z As Integer = -1
        For I = 0 To Objektverwalter.AlleGebäude.Length - 1
            If Objektverwalter.AlleGebäude(I).GebäudeID = GebäudeID Then
                Return I
            End If
        Next
        Return 0
    End Function
#End Region

    ''' <summary>
    ''' Sollte nur von Spielfeld aufgerufen werden.
    ''' Extern gezogene Einheiten brauchen dann noch ein Update.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim S As ObjektSpieler = MemberwiseClone()
        S.KOS = New ObjektKO() {ObjektLadeklasse.NewKO(KOS(0).KOID, Spieler), Nothing}
        If KOS(1) IsNot Nothing Then S.KOS(1) = ObjektLadeklasse.NewKO(KOS(1).KOID, Spieler)
        ReDim S.Sichtfelder(Sichtfelder.Length - 1)
        For I = 0 To Sichtfelder.Length - 1
            S.Sichtfelder(I) = New Vector4(Sichtfelder(I).X, Sichtfelder(I).Y, Sichtfelder(I).Z, Sichtfelder(I).W)
        Next
        ReDim S.ExternGezogeneEinheiten(ExternGezogeneEinheiten.Length - 1)
        For I = 0 To ExternGezogeneEinheiten.Length - 1
            S.ExternGezogeneEinheiten(I) = ExternGezogeneEinheiten(I).Clone
        Next
        If Bauliste IsNot Nothing Then
            S.Bauliste = Bauliste.Clone
        End If
        Return S
    End Function
End Class
